import { ElMessage, ElNotification } from 'element-plus'
import type { AxiosError } from 'axios'

/**
 * 统一错误提示工具类
 * 用于处理不同类型的错误并提供用户友好的提示
 */
export class ErrorHandler {
  /**
   * 处理网络错误
   * @param error 错误对象
   * @param context 错误上下文信息
   */
  static handleNetworkError(error: any, context?: string): void {
    const contextMsg = context ? `[${context}] ` : ''
    
    if (error.code === 'NETWORK_ERROR' || !navigator.onLine) {
      ElMessage.error(`${contextMsg}网络连接已断开，请检查网络设置`)
      return
    }
    
    if (error.code === 'ECONNREFUSED' || error.message?.includes('Failed to fetch')) {
      ElMessage.error(`${contextMsg}无法连接到服务器，请检查服务器状态`)
      return
    }
    
    if (error.code === 'ETIMEDOUT' || error.message?.includes('timeout')) {
      ElMessage.error(`${contextMsg}请求超时，请稍后重试`)
      return
    }
    
    // 通用网络错误
    ElMessage.error(`${contextMsg}网络错误，请检查网络连接后重试`)
  }
  
  /**
   * 处理CORS错误
   * @param error 错误对象
   * @param context 错误上下文信息
   */
  static handleCORSError(error: any, context?: string): void {
    const contextMsg = context ? `[${context}] ` : ''
    
    if (error.message?.includes('CORS') || error.message?.includes('Cross-Origin')) {
      ElMessage.error(`${contextMsg}跨域请求被阻止，请联系管理员配置CORS`)
      return
    }
    
    // 默认处理为网络错误
    this.handleNetworkError(error, context)
  }
  
  /**
   * 处理SSE流中断错误
   * @param error 错误对象
   * @param context 错误上下文信息
   */
  static handleSSEError(error: any, context?: string): void {
    const contextMsg = context ? `[${context}] ` : ''
    
    if (error.name === 'AbortError') {
      ElMessage.info(`${contextMsg}请求已取消`)
      return
    }
    
    if (error.type === 'readable-stream-error') {
      ElMessage.error(`${contextMsg}数据流读取错误，请重新发送消息`)
      return
    }
    
    if (error.message?.includes('EventSource') || error.message?.includes('SSE')) {
      ElMessage.error(`${contextMsg}实时连接中断，请刷新页面重试`)
      return
    }
    
    // 默认处理为网络错误
    this.handleNetworkError(error, context)
  }
  
  /**
   * 处理后端服务器错误
   * @param error 错误对象
   * @param context 错误上下文信息
   */
  static handleServerError(error: any, context?: string): void {
    const contextMsg = context ? `[${context}] ` : ''
    
    // 处理HTTP状态码错误
    if (error.response) {
      const status = error.response.status
      const data = error.response.data
      
      switch (status) {
        case 400:
          ElMessage.error(`${contextMsg}请求参数错误: ${data?.message || '请检查输入内容'}`)
          break
        case 401:
          ElMessage.error(`${contextMsg}身份验证失败，请重新登录`)
          break
        case 403:
          ElMessage.error(`${contextMsg}访问被拒绝，权限不足`)
          break
        case 404:
          ElMessage.error(`${contextMsg}请求的资源不存在`)
          break
        case 429:
          ElMessage.error(`${contextMsg}请求过于频繁，请稍后再试`)
          break
        case 500:
          ElMessage.error(`${contextMsg}服务器内部错误，请稍后重试`)
          break
        case 502:
          ElMessage.error(`${contextMsg}网关错误，请稍后重试`)
          break
        case 503:
          ElMessage.error(`${contextMsg}服务暂时不可用，请稍后重试`)
          break
        case 504:
          ElMessage.error(`${contextMsg}网关超时，请稍后重试`)
          break
        default:
          ElMessage.error(`${contextMsg}服务器错误 (${status}): ${data?.message || '未知错误'}`)
      }
      return
    }
    
    // 处理其他服务器错误
    if (error.message?.includes('500') || error.message?.includes('Internal Server Error')) {
      ElMessage.error(`${contextMsg}服务器内部错误，请稍后重试`)
      return
    }
    
    // 默认处理为网络错误
    this.handleNetworkError(error, context)
  }
  
  /**
   * 处理通用错误
   * @param error 错误对象
   * @param context 错误上下文信息
   * @param type 错误类型，可选值：network, cors, sse, server, auto
   */
  static handleError(error: any, context?: string, type: 'network' | 'cors' | 'sse' | 'server' | 'auto' = 'auto'): void {
    if (type === 'network') {
      this.handleNetworkError(error, context)
    } else if (type === 'cors') {
      this.handleCORSError(error, context)
    } else if (type === 'sse') {
      this.handleSSEError(error, context)
    } else if (type === 'server') {
      this.handleServerError(error, context)
    } else {
      // 自动检测错误类型
      this.autoDetectAndHandleError(error, context)
    }
  }
  
  /**
   * 自动检测错误类型并处理
   * @param error 错误对象
   * @param context 错误上下文信息
   */
  private static autoDetectAndHandleError(error: any, context?: string): void {
    // 检测CORS错误
    if (error.message?.includes('CORS') || error.message?.includes('Cross-Origin')) {
      this.handleCORSError(error, context)
      return
    }
    
    // 检测SSE错误
    if (error.name === 'AbortError' || 
        error.type === 'readable-stream-error' ||
        error.message?.includes('EventSource') || 
        error.message?.includes('SSE')) {
      this.handleSSEError(error, context)
      return
    }
    
    // 检测服务器错误
    if (error.response || 
        error.message?.includes('500') || 
        error.message?.includes('Internal Server Error')) {
      this.handleServerError(error, context)
      return
    }
    
    // 默认处理为网络错误
    this.handleNetworkError(error, context)
  }
  
  /**
   * 显示成功消息
   * @param message 消息内容
   * @param context 上下文信息
   */
  static showSuccess(message: string, context?: string): void {
    const contextMsg = context ? `[${context}] ` : ''
    ElMessage.success(`${contextMsg}${message}`)
  }
  
  /**
   * 显示信息消息
   * @param message 消息内容
   * @param context 上下文信息
   */
  static showInfo(message: string, context?: string): void {
    const contextMsg = context ? `[${context}] ` : ''
    ElMessage.info(`${contextMsg}${message}`)
  }
  
  /**
   * 显示警告消息
   * @param message 消息内容
   * @param context 上下文信息
   */
  static showWarning(message: string, context?: string): void {
    const contextMsg = context ? `[${context}] ` : ''
    ElMessage.warning(`${contextMsg}${message}`)
  }
  
  /**
   * 显示通知（用于需要用户注意的重要消息）
   * @param title 通知标题
   * @param message 通知内容
   * @param type 通知类型
   */
  static showNotification(
    title: string, 
    message: string, 
    type: 'success' | 'info' | 'warning' | 'error' = 'info'
  ): void {
    ElNotification({
      title,
      message,
      type,
      duration: 5000
    })
  }
}

// 导出默认实例
export default ErrorHandler